Saving Graphs to File

ggsave("file", plot )
Error: Unknown graphics device ''

Scales; Colour

Scale functions in ggplot2 take the form scale_[aesthetic]_[mapping]().

Let’s first focus on the following plot:

  1. Change the y-axis tick mark spacing to 10; change the colour spacing to include all powers of 10.

  1. Specify scales::*_format in the labels argument of a scale function to do the following:
    • Change the x-axis labels to dollar format (use scales::dollar_format())
    • Change the colour labels to comma format (use scales::comma_format())

  1. Use RColorBrewer to change the colour scheme.
    • Notice the three different types of scales: sequential, diverging, and continuous.

  1. Use viridis to change the colour to a colour-blind friendly scheme
    • Hint: add scale_colour_viridis_c (c stands for continuous; d discrete).
    • You can choose a palette with option.

Theming

Changing the look of a graphic can be achieved through the theme() layer.

There are “complete themes” that come with ggplot2, my favourite being theme_bw (I’ve grown tired of the default gray background, so theme_bw is refreshing).

  1. Change the theme of the following plot to theme_bw():

  1. Then, change font size of axis labels, and the strip background colour. Others?
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
     facet_wrap(~ Species) +
     geom_point() +
     labs(x = "Sepal Width",
          y = "Sepal Length",
          title = "Sepal sizes of three plant species") +
    theme_bw() +
    theme(FILL_IN_ARG_FOR_AXIS_TITLE = FILL_THIS_IN,
          strip.background = FILL_THIS_IN)

Plotly

Consider the following plot:

  1. Convert it to a plotly object by applying the ggplotly() function:
  1. You can save a plotly graph locally as an html file. Try saving the above:
    • NOTE: plotly graphs don’t seem to show up in Rmd notebooks, but they do with Rmd documents.
p %>% 
    ggplotly() %>% 
    htmlwidgets::saveWidget("LOCATION_GOES_HERE")
  1. Run this code to see the json format underneath:
  1. Check out code to make a plotly object from scratch using plot_ly() – scatterplot of gdpPercap vs lifeExp.
  1. Add population to form a z-axis for a 3D plot:
LS0tCnRpdGxlOiAiY20wMTMgRXhlcmNpc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQpsaWJyYXJ5KGdhcG1pbmRlcikKYGBgCgoKIyBTYXZpbmcgR3JhcGhzIHRvIEZpbGUKCi0gRG9uJ3QgdXNlIHRoZSBtb3VzZQotIFVzZSBgZ2dzYXZlYCBmb3IgZ2dwbG90CiAgICAtIFByYWN0aWNlIGJ5IHNhdmluZyB0aGUgZm9sbG93aW5nIHBsb3QgdG8gZmlsZTogCgpgYGB7cn0KcGxvdDwtZ2dwbG90KG10Y2FycywgYWVzKGhwLCB3dCkpICsgCiAgICBnZW9tX3BvaW50KCkKZ2dzYXZlKCJmaWxlIiwgcGxvdCApCmBgYAoKLSBCYXNlIFIgd2F5OiBwcmludCBwbG90cyAidG8gc2NyZWVuIiwgc2FuZHdpY2hlZCBiZXR3ZWVuIGBwZGYoKWAvYGpwZWcoKWAvYHBuZygpYC4uLiBhbmQgYGRldi5vZmYoKWAuIAotIFZlY3RvciB2cy4gcmFzdGVyOiBJbWFnZXMgYXJlIHN0b3JlZCBvbiB5b3VyIGNvbXB1dGVyIGFzIGVpdGhlciBfdmVjdG9yXyBvciBfcmFzdGVyXy4KICAgIC0gX19SYXN0ZXJfXzogYW4gYG5gIGJ5IGBtYCBncmlkIG9mIHBpeGVscywgZWFjaCB3aXRoIGl0cyBvd24gY29sb3VyLiBganBlZ2AsIGBwbmdgLCBgZ2lmYCwgYGJtcGAuCiAgICAtIF9fVmVjdG9yX186IHJlcHJlc2VudGVkIGFzIHNoYXBlcyBhbmQgbGluZXMuIGBwZGZgLCBbYHN2Z2BdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vZ3JhcGhpY3Mvc3ZnX2ludHJvLmFzcCkuCiAgICAtIEZvciB0aXBzOiBbIjEwIHRpcHMgZm9yIG1ha2luZyB5b3VyIFIgZ3JhcGhpY3MgbG9vayB0aGVpciBiZXN0IiJdKGh0dHA6Ly9ibG9nLnJldm9sdXRpb25hbmFseXRpY3MuY29tLzIwMDkvMDEvMTAtdGlwcy1mb3ItbWFraW5nLXlvdXItci1ncmFwaGljcy1sb29rLXRoZWlyLWJlc3QuaHRtbCkuCiAgICAKIyBTY2FsZXM7IENvbG91cgoKU2NhbGUgZnVuY3Rpb25zIGluIGBnZ3Bsb3QyYCB0YWtlIHRoZSBmb3JtIGBzY2FsZV9bYWVzdGhldGljXV9bbWFwcGluZ10oKWAuCgpMZXQncyBmaXJzdCBmb2N1cyBvbiB0aGUgZm9sbG93aW5nIHBsb3Q6CgpgYGB7cn0KcF9zY2FsZXMgPC0gZ2dwbG90KGdhcG1pbmRlciwgYWVzKGdkcFBlcmNhcCwgbGlmZUV4cCkpICsKICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cG9wKSwgYWxwaGE9MC4yKQpwX3NjYWxlcyArIAogICAgc2NhbGVfeF9sb2cxMCgpICsKICAgIHNjYWxlX2NvbG91cl9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIpCmBgYAoKMS4gQ2hhbmdlIHRoZSB5LWF4aXMgdGljayBtYXJrIHNwYWNpbmcgdG8gMTA7IGNoYW5nZSB0aGUgY29sb3VyIHNwYWNpbmcgdG8gaW5jbHVkZSBhbGwgcG93ZXJzIG9mIDEwLgoKYGBge3J9CnBfc2NhbGVzICsKICAgIHNjYWxlX3hfbG9nMTAoKSArCiAgICBzY2FsZV9jb2xvdXJfY29udGludW91cygKICAgICAgICB0cmFucyAgPSAibG9nMTAiLCAKICAgICAgICBicmVha3MgPSAxMF4oMToxMCkgIyB3aGF0IG51bWJlcnMgZG8gd2Ugd2FudCB0byBwdXQgdGljayBtYXJrcyBvbgogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTE6MTAqMTApCmBgYAoKMi4gU3BlY2lmeSBgc2NhbGVzOjoqX2Zvcm1hdGAgaW4gdGhlIGBsYWJlbHNgIGFyZ3VtZW50IG9mIGEgc2NhbGUgZnVuY3Rpb24gdG8gZG8gdGhlIGZvbGxvd2luZzoKICAgIC0gQ2hhbmdlIHRoZSB4LWF4aXMgbGFiZWxzIHRvIGRvbGxhciBmb3JtYXQgKHVzZSBgc2NhbGVzOjpkb2xsYXJfZm9ybWF0KClgKQogICAgLSBDaGFuZ2UgdGhlIGNvbG91ciBsYWJlbHMgdG8gY29tbWEgZm9ybWF0ICh1c2UgYHNjYWxlczo6Y29tbWFfZm9ybWF0KClgKQoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoc2NhbGVzKQpsaWJyYXJ5KHNjYWxlcykKcF9zY2FsZXMgKwogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgICBzY2FsZV9jb2xvdXJfY29udGludW91cygKICAgICAgICB0cmFucyAgPSAibG9nMTAiLCAKICAgICAgICBicmVha3MgPSAxMF4oMToxMCksCiAgICAgICAgbGFiZWxzID0gY29tbWFfZm9ybWF0KCkKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpCmBgYAoKMy4gVXNlIGBSQ29sb3JCcmV3ZXJgIHRvIGNoYW5nZSB0aGUgY29sb3VyIHNjaGVtZS4KICAgIC0gTm90aWNlIHRoZSB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2Ygc2NhbGVzOiBzZXF1ZW50aWFsLCBkaXZlcmdpbmcsIGFuZCBjb250aW51b3VzLgoKYGBge3J9CiMjIEFsbCBwYWxldHRlcyB0aGUgY29tZSB3aXRoIFJDb2xvckJyZXdlcjoKaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikKbGlicmFyeShzY2FsZXMpClJDb2xvckJyZXdlcjo6ZGlzcGxheS5icmV3ZXIuYWxsKCkgIyB0byBjaGVjayB0aGUgcGFsZXR0ZSBuYW1lcy4gCnBfc2NhbGVzICsKICAgIHNjYWxlX3hfbG9nMTAobGFiZWxzPWRvbGxhcl9mb3JtYXQoKSkgKwogICAgc2NhbGVfY29sb3VyX2Rpc3RpbGxlcigKICAgICAgICB0cmFucyAgID0gImxvZzEwIiwKICAgICAgICBicmVha3MgID0gMTBeKDE6MTApLAogICAgICAgIGxhYmVscyAgPSBjb21tYV9mb3JtYXQoKSwKICAgICAgICBwYWxldHRlID0gIkdyZWVucyIKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpCmBgYAoKNC4gVXNlIGB2aXJpZGlzYCB0byBjaGFuZ2UgdGhlIGNvbG91ciB0byBhIGNvbG91ci1ibGluZCBmcmllbmRseSBzY2hlbWUKICAgIC0gSGludDogYWRkIGBzY2FsZV9jb2xvdXJfdmlyaWRpc19jYCAoYGNgIHN0YW5kcyBmb3IgY29udGludW91czsgYGRgIGRpc2NyZXRlKS4KICAgIC0gWW91IGNhbiBjaG9vc2UgYSBwYWxldHRlIHdpdGggYG9wdGlvbmAuCgpgYGB7cn0KcF9zY2FsZXMgKwogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoCiAgICAgICAgdHJhbnMgICA9ICJsb2cxMCIsCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwKICAgICAgICBsYWJlbHMgID0gY29tbWFfZm9ybWF0KCkKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpCmBgYAoKIyBUaGVtaW5nCgpDaGFuZ2luZyB0aGUgbG9vayBvZiBhIGdyYXBoaWMgY2FuIGJlIGFjaGlldmVkIHRocm91Z2ggdGhlIGB0aGVtZSgpYCBsYXllci4KClRoZXJlIGFyZSBbImNvbXBsZXRlIHRoZW1lcyJdKGh0dHA6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2dndGhlbWUuaHRtbCkgdGhhdCBjb21lIHdpdGggYGdncGxvdDJgLCBteSBmYXZvdXJpdGUgYmVpbmcgYHRoZW1lX2J3YCAoSSd2ZSBncm93biB0aXJlZCBvZiB0aGUgZGVmYXVsdCBncmF5IGJhY2tncm91bmQsIHNvIGB0aGVtZV9id2AgaXMgcmVmcmVzaGluZykuCgoxLiBDaGFuZ2UgdGhlIHRoZW1lIG9mIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBgdGhlbWVfYncoKWA6CgpgYGB7cn0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5XaWR0aCwgU2VwYWwuTGVuZ3RoKSkgKwogICAgIGZhY2V0X3dyYXAofiBTcGVjaWVzKSArCiAgICAgZ2VvbV9wb2ludCgpICsKICAgICBsYWJzKHggPSAiU2VwYWwgV2lkdGgiLAogICAgICAgICAgeSA9ICJTZXBhbCBMZW5ndGgiLAogICAgICAgICAgdGl0bGUgPSAiU2VwYWwgc2l6ZXMgb2YgdGhyZWUgcGxhbnQgc3BlY2llcyIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKQpgYGAKCjIuIFRoZW4sIGNoYW5nZSBmb250IHNpemUgb2YgYXhpcyBsYWJlbHMsIGFuZCB0aGUgc3RyaXAgYmFja2dyb3VuZCBjb2xvdXIuIE90aGVycz8KCmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNlcGFsLldpZHRoLCBTZXBhbC5MZW5ndGgpKSArCiAgICAgZmFjZXRfd3JhcCh+IFNwZWNpZXMpICsKICAgICBnZW9tX3BvaW50KCkgKwogICAgIGxhYnMoeCA9ICJTZXBhbCBXaWR0aCIsCiAgICAgICAgICB5ID0gIlNlcGFsIExlbmd0aCIsCiAgICAgICAgICB0aXRsZSA9ICJTZXBhbCBzaXplcyBvZiB0aHJlZSBwbGFudCBzcGVjaWVzIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShGSUxMX0lOX0FSR19GT1JfQVhJU19USVRMRSA9IEZJTExfVEhJU19JTiwKICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBGSUxMX1RISVNfSU4pCmBgYAoKCiMgUGxvdGx5CgpDb25zaWRlciB0aGUgZm9sbG93aW5nIHBsb3Q6CgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikKbGlicmFyeShwbG90bHkpCihwIDwtIGdhcG1pbmRlciAlPiUgCiAgICAgZmlsdGVyKGNvbnRpbmVudCAhPSAiT2NlYW5pYSIpICU+JSAKICAgICBnZ3Bsb3QoYWVzKGdkcFBlcmNhcCwgbGlmZUV4cCkpICsKICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cG9wKSwgYWxwaGE9MC4yKSArCiAgICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgICAgc2NhbGVfY29sb3VyX2Rpc3RpbGxlcigKICAgICAgICAgdHJhbnMgICA9ICJsb2cxMCIsCiAgICAgICAgIGJyZWFrcyAgPSAxMF4oMToxMCksCiAgICAgICAgIGxhYmVscyAgPSBjb21tYV9mb3JtYXQoKSwKICAgICAgICAgcGFsZXR0ZSA9ICJHcmVlbnMiCiAgICAgKSArCiAgICAgZmFjZXRfd3JhcCh+IGNvbnRpbmVudCkgKwogICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9MTAqKDE6MTApKSArCiAgICAgdGhlbWVfYncoKSkKYGBgCgoxLiBDb252ZXJ0IGl0IHRvIGEgYHBsb3RseWAgb2JqZWN0IGJ5IGFwcGx5aW5nIHRoZSBgZ2dwbG90bHkoKWAgZnVuY3Rpb246CgpgYGB7cn0KZ2dwbG90bHkocCkKYGBgCgoyLiBZb3UgY2FuIHNhdmUgYSBwbG90bHkgZ3JhcGggbG9jYWxseSBhcyBhbiBodG1sIGZpbGUuIFRyeSBzYXZpbmcgdGhlIGFib3ZlOgogICAgLSBOT1RFOiBwbG90bHkgZ3JhcGhzIGRvbid0IHNlZW0gdG8gc2hvdyB1cCBpbiBSbWQgX25vdGVib29rc18sIGJ1dCB0aGV5IGRvIHdpdGggUm1kIF9kb2N1bWVudHNfLgoKYGBge3J9CnAgJT4lIAogICAgZ2dwbG90bHkoKSAlPiUgCiAgICBodG1sd2lkZ2V0czo6c2F2ZVdpZGdldCgiTE9DQVRJT05fR09FU19IRVJFIikKYGBgCgoKMy4gUnVuIHRoaXMgY29kZSB0byBzZWUgdGhlIGpzb24gZm9ybWF0IHVuZGVybmVhdGg6CgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygibGlzdHZpZXdlciIpCnAgJT4lIAogICAgZ2dwbG90bHkoKSAlPiUgCiAgICBwbG90bHlfanNvbigpCmBgYAoKCjQuIENoZWNrIG91dCBjb2RlIHRvIG1ha2UgYSBwbG90bHkgb2JqZWN0IGZyb20gc2NyYXRjaCB1c2luZyBgcGxvdF9seSgpYCAtLSBzY2F0dGVycGxvdCBvZiBnZHBQZXJjYXAgdnMgbGlmZUV4cC4KICAgIC0gQ2hlY2sgb3V0IHRoZSBbY2hlYXQgc2hlZXRdKGh0dHBzOi8vaW1hZ2VzLnBsb3QubHkvcGxvdGx5LWRvY3VtZW50YXRpb24vaW1hZ2VzL3JfY2hlYXRfc2hlZXQucGRmKS4KCmBgYHtyfQpwbG90X2x5KGdhcG1pbmRlciwgCiAgICAgICAgeCA9IH5nZHBQZXJjYXAsIAogICAgICAgIHkgPSB+bGlmZUV4cCwgCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyIiwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG9wYWNpdHkgPSAwLjIpICU+JSAKICAgIGxheW91dCh4YXhpcyA9IGxpc3QodHlwZSA9ICJsb2ciKSkKYGBgCgo1LiBBZGQgcG9wdWxhdGlvbiB0byBmb3JtIGEgei1heGlzIGZvciBhIDNEIHBsb3Q6CgpgYGB7cn0KcGxvdF9seShnYXBtaW5kZXIsIAogICAgICAgIHggPSB+Z2RwUGVyY2FwLCAKICAgICAgICB5ID0gfmxpZmVFeHAsIAogICAgICAgIHogPSB+cG9wLAogICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG9wYWNpdHkgPSAwLjIpCmBgYAoKCg==